package com.bit继承多态.demo1;


class OuterClass2{

    public int data1 = 10;
    private int data2 = 20;
    public static int data3 = 30;

    //static OuterClass2 out = new OuterClass2();

    public void method(){
        System.out.println("OuterClass2::method()");
    }

    /**
     * 静态内部类当中的一些问题
     * 1、如何实例化静态内部类
     * OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass();
     * 2、在静态内部类当中 只能访问外部类的静态成员
     *   问题： 如果要访问外部类的非静态成员， 应该怎么访问
     *   提供外部类对象
     */
    static class InnerClass{
        public int data4 = 40;
        private int data5 = 50;
        public static int data6 = 60;

       /* 如果要访问要访问外部类的非静态成员， 应该怎么访问
        OuterClass2 out = new OuterClass2();*/

        OuterClass2 out;//没有初始化  默认为null

        //构造方法
        InnerClass(){
            System.out.println("InnerClass()");
        }

        InnerClass(OuterClass2 out){
            this.out = out;
            System.out.println("InnerClass()");
        }

        public void method(){
            System.out.println(out.data1);
            System.out.println(out.data2);
            System.out.println(data3);
            System.out.println(data4);
            System.out.println(data5);
            System.out.println(data6);
            System.out.println("innerClass的method方法！");
        }
    }
}
class Test{
    public int a = 19;

    public void test(){
        System.out.println("test()!");
    }
}
public class TestDemo2 {
    /**
     * 匿名内部类
     * @param args
     */
    /*public static void main(String[] args) {
        new Test(){

        }.test();
    }*/
    //还可以这样写
    public static void main(String[] args) {
        new Test() {
            public void test1(){
                System.out.println("hahaha!");

                }
            @Override
            public void test() {
                System.out.println("我去!");
            }
        }.test();
    }


    public static void main1(String[] args) {
        //不需要外部类对象，所以静态内部类使用的频率比较多
        OuterClass2.InnerClass innerClass = new OuterClass2.InnerClass(new OuterClass2());
        innerClass.method();
    }
}
